#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>

using namespace cv;
using namespace std;

// 封装一个函数 画出所有人脸方框
bool DrawRect(Mat& src, vector<Rect>& face)
{

    if (face.empty()) { // face.size() == 0
        return false;
    }
    int len = face.size();

   // for 循环执行
   for( int a = 1; a < len; a = a + 1 )
   {
           cout << "a 的值：" << a << endl;
       rectangle(src, Rect(
                       face[a].tl().x,
                       face[a].tl().y,
                       face[a].width,
                       face[a].height
               ), Scalar(0, 0, 255), 3);
   }
   return true;
}

// 封装一个函数 画出所有人脸方框 添加角
bool DrawRectJiao(Mat& src, vector<Rect>& face)
{

    if (face.empty()) { // face.size() == 0
        return false;
    }
    int len = face.size();

   // for 循环执行
   for( int a = 1; a < len; a = a + 1 )
   {
           cout << "a 的值：" << a << endl;
       rectangle(src, Rect(
                       face[a].tl().x,
                       face[a].tl().y,
                       face[a].width,
                       face[a].height
               ), Scalar(0, 0, 255), 3);
   }
   return true;
}

int main()
{

    cout << "开始执行" << endl;
    /*
    // 1 图片人脸识别
    Mat img = imread("C:/Users/zengye/Pictures/3.png");

    // 加载完成后做人脸识别
        vector<Rect> face;
        // 1.1 创建人脸检测器
        CascadeClassifier object;
        // 1.2 加载 Harr分类器 用于人脸识别 xml文件
        object.load("D:/study/qt/day02/haarcascade_frontalface_alt.xml");
        // 1.3 人脸识别
        object.detectMultiScale(img, face);
        // 1.4 识别人脸 画出来
        // rectangle(img, Rect(200, 100, 350, 450), Scalar(0, 0, 255), 3);
//        rectangle(img, Rect(
//                        face[0].tl().x,
//                        face[0].tl().y,
//                        face[0].width,
//                        face[0].height
//                ), Scalar(0, 0, 255), 3);
        DrawRect(img,face);

    imshow("mm", img);
    */


    // 2 视频人脸识别
    /*
    // 2.1 创建人脸检测器
    CascadeClassifier object;
    // 2.2 加载 Harr分类器 用于人脸识别 xml文件
    object.load("D:/study/qt/day02/haarcascade_frontalface_alt.xml");
    vector<Rect> face;
    VideoCapture cap = VideoCapture("C:/Users/zengye/Pictures/singing.mp4");
    Mat img;
    while(cap.read(img)) // 循环读取视频里的每一帧 保存在img
    {
        // 2.3 人脸识别
        object.detectMultiScale(img, face);
        // 2.4 视频里面画框
        DrawRect(img,face);
//        rectangle(img,Rect(200,100,250,450),Scalar(0,0,255),3);

        imshow("video", img);
        waitKey(30);
    }
    waitKey(0);  //在指定的时间内等待用户按下按键
    */

    // 3 通过摄像头 进行人脸识别
    // 3.1 创建人脸检测器
    CascadeClassifier object;
    // 3.2 加载 Harr分类器 用于人脸识别 xml文件
    object.load("D:/study/qt/day02/haarcascade_frontalface_alt.xml");
    vector<Rect> face;
    VideoCapture cap = VideoCapture(0);  // 0 1 2 3
    Mat img;
    Mat imgJiao = imread("D:/study/qt/day02/horn.png");
    int jiaoWidth = imgJiao.cols;
    int jiaoHeight = imgJiao.rows;

    // 定义区域
    Mat imgROI;

    while(cap.read(img)) // 循环读取视频里的每一帧 保存在img
    {
        // 2.3 人脸识别
        object.detectMultiScale(img, face);
        // 2.4 视频里面画框
//        DrawRect(img,face); // 人脸

        // 如果定义不为空
        if (!face.empty()) {
            int x = face[0].tl().x;
            int y = face[0].tl().y;

            if (
                    x > 0 && y > 0
                    &&
                    x + imgJiao.cols <= img.cols // 不能超过宽度
                    &&
                    y + imgJiao.rows <= img.rows // 不能超过宽度
                    ) {
                imgROI = img(Rect(x - 30,y - 60,jiaoWidth,jiaoHeight)); // 设置区域 img 原图片
                addWeighted(imgROI, 1.0, imgJiao, 1,0,imgROI); // 进行添加
            }
        }

        imshow("video", img);
        waitKey(30);
    }
//    waitKey(0);  //在指定的时间内等待用户按下按键

    waitKey(0);  //在指定的时间内等待用户按下按键

    cout << "Hello World!" << endl;

    return 0;
}
